package com.example.a14;

import org.springframework.cglib.core.Signature;

public class TargetFastClass {

    static Signature s0 = new Signature("save", "()V");
    static Signature s1 = new Signature("save", "(I)V");
    static Signature s2 = new Signature("save", "(J)V");

    /**
     * 获取目标方法的编号
     * <p>
     * Target
     *      save()              0
     *      save(int i)         1
     *      save(long j)        2
     *
     * @param signature 签名对象，包括方法名字，参数，返回值等信息
     * @return 返回与签名对应的索引值如果找不到匹配的签名，则返回特定的错误码或抛出异常
     */
    public int getIndex(Signature signature) {
        if (s0.equals(signature)) {
            return 0;
        } else if (s1.equals(signature)) {
            return 1;
        } else if (s2.equals(signature)) {
            return 2;
        }

        return -1; // 表示没找到
    }

    /**
     * 根据方法编号，正常调用目标对象方法
     *
     * @param index  目标方法的编号
     * @param target 要调用方法的目标对象。
     * @param args   方法调用所需的参数数组。
     * @return 方法调用的结果
     */
    public Object invoke(int index, Object target, Object[] args) {
        if (index == 0) {
            ((Target) target).save();
            return null;
        } else if (index == 1) {
            ((Target) target).save((int) args[0]);
            return null;
        } else if (index == 2) {
            ((Target) target).save((long) args[0]);
            return null;
        } else {
            throw new RuntimeException("无此方法");
        }
    }

    public static void main(String[] args) {
        TargetFastClass fastClass = new TargetFastClass();
        int index = fastClass.getIndex(new Signature("save", "(J)V"));
        System.out.println(index);
        fastClass.invoke(index, new Target(),new Object[]{100L});
    }

}
